home *** CD-ROM | disk | FTP | other *** search
/ Floppyshop 2 / Floppyshop - 2.zip / Floppyshop - 2.iso / art&graf.ix / art-0039 / source / dcprnt09.mod < prev    next >
Text File  |  1997-04-16  |  9KB  |  342 lines

  1. IMPLEMENTATION MODULE DCPrnt09;
  2.  
  3. (* This program will PRINT pictures.
  4.  
  5. *)
  6.  
  7. (*--------------------------------------------------------------------*)
  8. (*   This is version 1.00         April 1987      L.G. Miller.        *)
  9. (*--------------------------------------------------------------------*)
  10.  
  11. (* Pressing the any mouse button whilst printing will request an
  12.    ABORT of the print.
  13.  *)
  14.  
  15. (*   IMPORT Trace; *)
  16.  
  17. FROM SYSTEM             IMPORT ADDRESS, ADR;
  18.  
  19. FROM Bios               IMPORT  bcostat, bconout;
  20.  
  21. IMPORT Forms;
  22.  
  23. FROM VDI                IMPORT vq_mouse;
  24.  
  25. FROM ManyWindows        IMPORT VDIHandle, ShowAlert;
  26.  
  27. FROM Strings            IMPORT String, Concat;
  28.  
  29. FROM DCGlobal           IMPORT
  30. (* CONST *)
  31.  
  32.   HiResMaxX,         (* =  639; *)  
  33.   HiResMaxY,         (* =  399; *)  
  34.   HiResNoPlanes,     (* =  1; *)
  35.  
  36.  
  37. (* TYPE *)
  38.  
  39.   PrinterTypes,
  40.  
  41.   HiResScreen,
  42.  
  43.   PictureImage,
  44.   PrintImage,
  45.  
  46.   DegasPicture; 
  47.  
  48.  
  49. FROM    DCPrtCnv        IMPORT QueryPrinterToUse,
  50.                                PrtCnv8BitSlice;
  51.  
  52. (*  ---------------------------------------------------------- *)
  53. CONST
  54.    ESC             = CHR(1BH);
  55.    BITSPERBYTE         =  8 ;
  56.    BITSPERWORD        = 16;
  57.    PRT                  =  0;
  58.    CON                  =  2;
  59.  
  60. TYPE 
  61.    PrintLine = ARRAY [ 0 .. 5000 ] OF CHAR;
  62.    
  63.  
  64. VAR PrintLineBuffer : PrintLine;
  65.  
  66.  
  67. PROCEDURE WaitForNoMouse;
  68.   VAR dummy : CARDINAL;
  69.       stat  : BITSET;
  70.   BEGIN
  71.     REPEAT vq_mouse(VDIHandle, stat,dummy,dummy) UNTIL stat = {};
  72.   END WaitForNoMouse;
  73.  
  74.  
  75. PROCEDURE CheckPrinterReady() : BOOLEAN;
  76.   VAR i : LONGCARD;
  77.   BEGIN
  78.     i := 100000;
  79.     WHILE ( bcostat(PRT) = 0 ) &  ( i > 0 ) DO DEC(i) END;
  80.     RETURN ( i > 0 );
  81.   END CheckPrinterReady;  
  82.  
  83.  
  84. PROCEDURE GetPrinterReadyMsg () : BOOLEAN; (* ABORT if FALSE *)
  85.   VAR f : BOOLEAN;
  86.       i : INTEGER;
  87.   BEGIN
  88.     REPEAT
  89.      i := ShowAlert('Printer Not Ready!!!|CANCEL will ABORT print',2,1);
  90.      IF i = 2  THEN WaitForNoMouse; RETURN FALSE END;
  91.     UNTIL CheckPrinterReady();
  92.     WaitForNoMouse;
  93.     RETURN TRUE
  94.   END GetPrinterReadyMsg;
  95.  
  96.  
  97. PROCEDURE QueryAbort() : BOOLEAN; (* If left button down then prompt *)
  98.   CONST leftbutton = 15; (* bit numbering starts on left *)
  99.         rightbutton= 14;
  100.  
  101.   VAR i, dummy : CARDINAL;
  102.       bstatus  : BITSET;
  103.   BEGIN
  104.     vq_mouse(VDIHandle, bstatus, dummy, dummy);
  105.     IF ( leftbutton  IN bstatus ) 
  106.     OR ( rightbutton IN bstatus ) THEN
  107.       i:= ShowAlert('CONTINUE THE PRINT?|CANCEL will ABORT the print',2,1);
  108.       WaitForNoMouse;
  109.     END;  
  110.     RETURN ( i = 2 ); 
  111.   END QueryAbort;
  112.  
  113.  
  114. PROCEDURE  PrintChar ( ch : CHAR ) : BOOLEAN; (* ABORT if FALSE *)
  115.   BEGIN
  116.     LOOP
  117.       IF CheckPrinterReady() THEN
  118.          bconout(PRT,ch);
  119.          RETURN TRUE
  120.       ELSE
  121.          IF NOT GetPrinterReadyMsg() THEN RETURN FALSE END;
  122.       END;
  123.     END; 
  124.   END PrintChar;
  125.  
  126.  
  127. PROCEDURE PrintString ( VAR s : ARRAY OF CHAR; n : CARDINAL ) : BOOLEAN;
  128.   VAR i : CARDINAL;
  129.       printed : BOOLEAN;
  130.   BEGIN
  131.     i := 0;
  132.     REPEAT
  133.       printed := PrintChar(s[i]);
  134.       INC(i);
  135.     UNTIL ( i >= n ) OR NOT printed;
  136.     RETURN printed;
  137.   END PrintString;
  138.  
  139.  
  140. PROCEDURE SetFX80PrinterMode( linewidth, modeno : INTEGER ) : BOOLEAN;
  141.   VAR printed : BOOLEAN;
  142.       s : String;
  143.   BEGIN
  144.     s[0] := ESC;
  145.     s[1] := '*';
  146.     s[2] := CHAR(modeno);
  147.     s[3] := CHAR(linewidth MOD 256 );  
  148.     s[4] := CHAR(linewidth DIV 256 );
  149.     RETURN PrintString(s,5)   
  150.   END SetFX80PrinterMode;
  151.  
  152.  
  153. PROCEDURE SetMX80PrinterMode( linewidth, modeno : INTEGER ) : BOOLEAN;
  154.   VAR printed : BOOLEAN;
  155.       s : String;
  156.   BEGIN
  157.     s[0] := ESC;
  158.     IF modeno = 4 THEN
  159.        s[1] := 'K' ;
  160.     ELSE
  161.        s[1] := 'L' ;
  162.     END;
  163.     s[2] := CHAR(linewidth MOD 256 );  
  164.     s[3] := CHAR(linewidth DIV 256 );
  165.     RETURN PrintString(s,4)   
  166.   END SetMX80PrinterMode;
  167.  
  168.  
  169. PROCEDURE SetPrinterMode( linewidth, modeno : INTEGER ) : BOOLEAN;
  170.   VAR printed : BOOLEAN;
  171.       s : String;
  172.   BEGIN
  173.     IF QueryPrinterToUse() = EpsonFX80 THEN
  174.        RETURN SetFX80PrinterMode( linewidth, modeno );
  175.     ELSE
  176.        RETURN SetMX80PrinterMode( linewidth, modeno );
  177.     END;
  178.   END SetPrinterMode;
  179.  
  180.  
  181.  
  182. PROCEDURE SetLineFeedDepth( n216ths : INTEGER ) : BOOLEAN;
  183.   VAR s : String;
  184.   BEGIN
  185.     s[0] := ESC; s[1] := '3'; s[2] := CHAR(n216ths);
  186.     RETURN PrintString(s,3);
  187.   END SetLineFeedDepth;
  188.  
  189.  
  190. PROCEDURE PrintCRLF (n : INTEGER) :  BOOLEAN;
  191.   VAR s : String;
  192.       printed : BOOLEAN;
  193.       i : INTEGER;
  194.   BEGIN
  195.     s[0] := CHAR(13);
  196.     s[1] := CHAR(10);
  197.     i := 1;
  198.     WHILE PrintString(s,2) & ( i < n ) DO INC(i) END;
  199.     RETURN ( i >= n );
  200.   END PrintCRLF;  
  201.  
  202. PROCEDURE PrintBottomMargin ( n : CARDINAL ) : BOOLEAN;
  203.     VAR i : CARDINAL;
  204.   BEGIN
  205.     i := 0;
  206.     WHILE PrintChar(' ') & ( i < n ) DO INC(i) END;
  207.     RETURN ( i >= n );
  208.   END PrintBottomMargin;
  209.  
  210.  
  211. PROCEDURE SetFormLength ( n : CARDINAL ) : BOOLEAN;
  212.   VAR s : String;
  213.   BEGIN
  214.     s[0] := ESC; s[1] := 'C'; s[2] := 0C; s[3] := CHAR(n);
  215.     RETURN PrintString(s,4);
  216.   END SetFormLength;
  217.  
  218.  
  219. PROCEDURE ResetPrinter() : BOOLEAN;
  220.   VAR s : String;
  221.   BEGIN
  222.     s[0] := ESC; s[1] := '@'; 
  223.     RETURN PrintString(s,2);
  224.   END ResetPrinter;
  225.  
  226.  
  227. PROCEDURE FormFeed() : BOOLEAN;
  228.   VAR s : String;
  229.   BEGIN
  230.     s[0] := CHAR(12);  
  231.     RETURN PrintString(s,1);
  232.   END FormFeed;
  233.  
  234.  
  235. PROCEDURE PrintHiResPicture09L ( VAR PictureDetails : PictureImage;
  236.                                  VAR PrintDetails   : PrintImage;
  237.                                  VAR Picture        : HiResScreen );
  238.   VAR      nomore, newpic : BOOLEAN;
  239.         
  240.   BEGIN
  241.     nomore := FALSE;
  242.     newpic := TRUE;
  243.  
  244.     IF NOT ResetPrinter() THEN RETURN END;
  245.     IF NOT SetFormLength(11) THEN RETURN END;
  246.     IF NOT PrintCRLF(PrintDetails.StartCharY) THEN RETURN END;
  247.         
  248.     REPEAT
  249.       PrtCnv8BitSlice( newpic,    (* first time thru = TRUE *)
  250.                         nomore,    (* all slices retrieved   *)
  251.                         Picture,   (* screen to print        *)
  252.  
  253.                         PictureDetails.StartX,
  254.                         PictureDetails.StartY,
  255.                         PictureDetails.Width,
  256.                         PictureDetails.Height,
  257.  
  258.                         PrintDetails.Width,
  259.                         PrintDetails.Height,
  260.                         PrintDetails.QueryLandscapePrint,
  261.  
  262.                         PrintLineBuffer );
  263.  
  264.       newpic := FALSE;
  265.       IF NOT PrintBottomMargin(PrintDetails.StartCharX) THEN RETURN END;
  266.       IF NOT SetPrinterMode(PrintDetails.Height,6) THEN RETURN END;
  267.       IF NOT PrintString(PrintLineBuffer, PrintDetails.Height) THEN
  268.          RETURN
  269.       END;
  270.       IF NOT SetLineFeedDepth(1) THEN RETURN END;
  271.       IF NOT PrintCRLF(1) THEN RETURN END;
  272.  
  273.       IF NOT PrintBottomMargin(PrintDetails.StartCharX) THEN RETURN END;
  274.       IF NOT SetPrinterMode(PrintDetails.Height,6) THEN RETURN END;
  275.       IF NOT PrintString(PrintLineBuffer, PrintDetails.Height) THEN
  276.          RETURN
  277.       END;
  278.  
  279.       IF NOT SetLineFeedDepth(21) THEN RETURN END;
  280.       IF NOT PrintCRLF(1) THEN RETURN END;
  281.       IF QueryAbort() THEN RETURN END;
  282.     UNTIL nomore;       
  283.     
  284.     IF NOT ResetPrinter() THEN RETURN END;
  285.   END PrintHiResPicture09L;
  286.  
  287.  
  288. PROCEDURE PrintHiResPicture09P ( VAR PictureDetails : PictureImage;
  289.                                  VAR PrintDetails   : PrintImage;
  290.                                  VAR Picture        : HiResScreen );
  291.   VAR      nomore, newpic : BOOLEAN;
  292.         
  293.   BEGIN
  294.     nomore := FALSE;
  295.     newpic := TRUE;
  296.  
  297.     IF NOT ResetPrinter() THEN RETURN END;
  298.     IF NOT SetFormLength(11) THEN RETURN END;
  299.     IF NOT PrintCRLF(PrintDetails.StartCharY) THEN RETURN END;
  300.         
  301.     REPEAT
  302.       PrtCnv8BitSlice( newpic,    (* first time thru = TRUE *)
  303.                         nomore,    (* all slices retrieved   *)
  304.                         Picture,   (* screen to print        *)
  305.  
  306.                         PictureDetails.StartX,
  307.                         PictureDetails.StartY,
  308.                         PictureDetails.Width,
  309.                         PictureDetails.Height,
  310.  
  311.                         PrintDetails.Width,
  312.                         PrintDetails.Height,
  313.                         PrintDetails.QueryLandscapePrint,
  314.  
  315.                         PrintLineBuffer );
  316.  
  317.       newpic := FALSE;
  318.       IF NOT PrintBottomMargin(PrintDetails.StartCharX) THEN RETURN END;
  319.       IF NOT SetPrinterMode(PrintDetails.Width,6) THEN RETURN END;
  320.       IF NOT PrintString(PrintLineBuffer, PrintDetails.Width) THEN
  321.          RETURN
  322.       END;
  323.       IF NOT SetLineFeedDepth(1) THEN RETURN END;
  324.       IF NOT PrintCRLF(1) THEN RETURN END;
  325.  
  326.       IF NOT PrintBottomMargin(PrintDetails.StartCharX) THEN RETURN END;
  327.       IF NOT SetPrinterMode(PrintDetails.Width ,6) THEN RETURN END;
  328.       IF NOT PrintString(PrintLineBuffer, PrintDetails.Width) THEN
  329.          RETURN
  330.       END;
  331.  
  332.       IF NOT SetLineFeedDepth(21) THEN RETURN END;
  333.       IF NOT PrintCRLF(1) THEN RETURN END;
  334.       IF QueryAbort() THEN RETURN END;
  335.     UNTIL nomore;       
  336.     
  337.     IF NOT ResetPrinter() THEN RETURN END;
  338.   END PrintHiResPicture09P;
  339.  
  340.  
  341. END DCPrnt09.
  342.